#define _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

void SLInit(SL* sl)
{
	sl->arr = NULL;
	sl->size = sl->capacity = 0;
}

void SLDestory(SL* sl)
{
	if (sl->arr)
	{
		free(sl->arr);
	}
	sl->arr = NULL;
	sl->size = sl->capacity = 0;
}

//void SLPrint(SL* sl)
//{
//	assert(sl);
//	for (int i = 0; i < sl->size; i++)
//	{
//		printf("%d ", sl->arr[i]);
//	}
//	printf("\n");
//}

void CheckSLCapacity(SL* sl)
{
	if (sl->size == sl->capacity)
	{
		int newCapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(sl->arr, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail\n");
			exit(1);
		}
		sl->arr = tmp;
		sl->capacity = newCapacity;
	}
}
void SLPushBack(SL* sl, SLDataType x)
{
	assert(sl);
	CheckSLCapacity(sl);
	sl->arr[sl->size] = x;
	sl->size++;
}

void SLPushFront(SL* sl, SLDataType x)
{
	assert(sl);
	CheckSLCapacity(sl);
	int end = sl->size;
	while (end > 0)
	{
		sl->arr[end] = sl->arr[end - 1];
		end--;
	}
	sl->arr[0] = x;
	sl->size++;
}

void SLPopBack(SL* sl)
{
	assert(sl);
	assert(sl->size);
	sl->size--;
}

void SLPopFront(SL* sl)
{
	assert(sl);
	assert(sl->size);
	int start = 0;
	while (start < sl->size -1)
	{
		sl->arr[start] = sl->arr[start + 1];
		start++;
	}
	sl->size--;

}

void SLInsert(SL* sl, SLDataType x, int pos)
{
	assert(sl);
	CheckSLCapacity(sl);
	int end = sl->size;
	while (end < pos)
	{
		sl->arr[end] = sl->arr[end - 1];
		end--;
	}
	sl->arr[pos] = x;
	sl->size++;
}

void SLErase(SL* sl, int pos)
{
	assert(sl);
	assert(sl->size);
	int start = pos;
	while (start < sl->size)
	{
		sl->arr[start] = sl->arr[start + 1];
		start++;
	}
	sl->size--;
}

//int SLFind(SL* sl, SLDataType x)
//{
//	assert(sl);
//	assert(sl->size);
//	for (int i = 0; i < sl->size; i++)
//	{
//		if (sl->arr[i] == x)
//		{
//			return i;
//		}
//	}
//	return -1;
//}